package czk.concrent.threadpool.timer;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 计划性任务调度线程池
 * @Author:ChenZhangKun
 * @Date: 2020/7/8 22:22
 */
public class ScheduledThreadPoolDemo {
    public static void main(String[] args) {
        // 获取对象
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
        scheduledExecutorService.schedule(()->{
            System.out.println(1);
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },1, TimeUnit.SECONDS);
        // 线程一不会营养线程二的执行，线程一抛异常也不会影响线程二
        scheduledExecutorService.schedule(()->{
            System.out.println(2);
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },1, TimeUnit.SECONDS);

        // 定时执行某些任务
        // 每隔一秒执行
        // 如果方法执行时间大于等待时间，则方法执行后立即执行，不会延时
        // 是每次执行时间为上一次任务开始起向后推一个时间间隔。
        scheduledExecutorService.scheduleAtFixedRate(()->{
            System.out.println(3);
        },1,1,TimeUnit.SECONDS);

        // 方法执行完毕后再延时一秒执行
        // 是每次执行时间为上一次任务结束起向后推一个时间间隔。
        scheduledExecutorService.scheduleWithFixedDelay(()->{
            System.out.println(4);
            try {
                Thread.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },1,1,TimeUnit.SECONDS);
    }
}
